# SQLFunction.java

    package org.codefilarete.stalactite.query.model.operator;

    import org.codefilarete.stalactite.query.model.Selectable;
    import org.codefilarete.stalactite.query.model.ValuedVariable;
    import org.codefilarete.stalactite.query.model.Variable;

    /**
     * Parent class that describes a function in some SQL statement
     *
     * @param <V> value type, can be a simple class as String or Integer or a complex one as {@link org.codefilarete.stalactite.query.model.operator.SQLFunction}
     * @param <O> java type of the function result
     * @author Guillaume Mary
     */
    public abstract class SQLFunction<V, O> implements Selectable<O> {

    	private final String functionName;
    	private final Class<O> javaType;
    	/** Value of argument */
    	private Variable<V> value;

    	protected SQLFunction(String functionName, Class<O> javaType) {
    		this(functionName, javaType, null);
    	}

    	protected SQLFunction(String functionName, Class<O> javaType, V value) {
    		this.functionName = functionName;
    		this.javaType = javaType;
    		this.value = new ValuedVariable<>(value);
    	}

    	public String getFunctionName() {
    		return functionName;
    	}

    	/**
    	 * @return the value of this operator
    	 */
    	public Variable<V> getValue() {
    		return value;
    	}

    	/**
    	 * Sets the value of this operator
    	 * @param value the new value
    	 */
    	public void setValue(Variable<V> value) {
    		this.value = value;
    	}

    	/**
    	 * Returns the function name
    	 * @return the function name
    	 */
    	@Override
    	public String getExpression() {
    		return functionName;
    	}

    	@Override
    	public Class<O> getJavaType() {
    		return javaType;
    	}

    	public Class<O> getType() {
    		return javaType;
    	}
    }